package com.atguigu.bigdata.scala.chapter05

import scala.util.control.Breaks

object Scala08_Function {

    def main(args: Array[String]): Unit = {

        // TODO 函数式编程 - 控制抽象

        // 抽象 => 不完整
        // 抽象类 & 抽象方法 ？

        // 如果一个函数的参数为函数，那么这个参数没有输入类型，只有Unit的场合，说明不关心函数输入，只关心函数的实现
        // 在声明时就可以将参数列表省略，那么参数类型就不完整了，所以可以理解为抽象
        // 所以在当前的场合下，是不需要考虑输入，只需要传入逻辑实现即可，然后由函数自动调用
        // 可以在函数中传递逻辑代码
        def test( f : =>Unit ): Unit = {
            f
        }

        //test( ()=>{println("zhangsan")} )
        //test( println("zhangsan") )

        // 控制抽象，如果参数的逻辑代码有多行，那么参数列表的小括号需要使用大括号代替
        // 调用这段逻辑时，因为没有参数列表，所以小括号不能使用

        // 这个语法可以让开发者自己设计语法结构
//        test {
//            val i = 10 + 10;
//            println(i)
//        }

        // breakable其实是一个函数，它有一个参数，这个参数也是函数，但是不需要输入，没有输出，
        // 所以采用控制抽象语法，只传递逻辑代码即可
        Breaks.breakable {
            for ( i <- 1 to 5 ) {
                if ( i == 3 ) {
                    // 跳出循环
                    Breaks.break() // 抛出异常
                }
                println(i)
            }
        }
    }
}
